package cn.tedu.charging.user.service.impl;

import cn.tedu.charging.common.exception.ServiceException;
import cn.tedu.charging.common.pojo.response.JsonResult;
import cn.tedu.charging.common.pojo.response.StatusCode;
import cn.tedu.charging.common.pojo.vo.StaffVO;
import cn.tedu.charging.user.feign.StaffClient;
import cn.tedu.charging.user.mapper.UserMapper;
import cn.tedu.charging.user.service.UserService;
import cn.tedu.charging.user.pojo.param.UserLoginParam;
import cn.tedu.charging.user.pojo.param.UserQuery;
import cn.tedu.charging.common.pojo.po.User;
import cn.tedu.charging.user.pojo.vo.UserVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;

    @Autowired
    StaffClient staffClient;
    @Override
    public UserVO login(UserLoginParam userLoginParam) {
        log.debug("登录接口业务层的入参是{}", userLoginParam);
//       登录业务的处理流程
//        1、通过入参的账号去web_user表里去查看有没有这个用户
        log.debug("登录接口业务层调用mapper层的入参是{}", userLoginParam.getTel());
        UserVO userVO = userMapper.selectByTel(userLoginParam.getTel());
        log.debug("登录接口业务层成功调用mapper层的入参是{}出参是{}", userLoginParam.getTel(), userVO);
//        1.1去web_user表格中校验密码和用户名是否正确
        if (userVO != null) {
            if (userVO.getPassword().equals(userLoginParam.getPassword())) {
//          2.1若是web_user表的web_user里含有这条数据，再通过账号去staff表中去查找相关的员工数据
                log.debug("调用员工业务层的login方法的入参为{}", userVO.getTel());
                JsonResult<StaffVO> jsonResult = staffClient.login(userVO.getTel());
                StaffVO staffVO = jsonResult.getData();//todo
                log.debug("调用员工业务层的login方法的入参为{}出参为{}", userVO.getTel(), staffVO);
//        2.2若staff表中含有这条数据，去role_staff表里查看是什么角色
                if (staffVO != null) {
                    userVO.setPermList(staffVO.getPermList());
                }
//        2，3在通过role_perm表里查看角色对应权限，
//        3.将此用户对应的权限返回给前端用来鉴权 todo
//        最后要返回UserVo
                log.debug("用户业务层的成功登录功能的入参为{}出参为{}", userLoginParam, userVO);
                return userVO;
            }
        }
//        4.若是用户表中没有此条数据，则返回用户或密码错误


        throw new ServiceException(StatusCode.PASSWORD_ERROR);
    }

    @Override
    public List<UserVO> selectUser(UserQuery userQuery) {
        log.debug("查询用户接口业务层的入参为{}", userQuery);
        log.debug("查询入参为{}", userQuery);
        List<UserVO> userVOList = userMapper.selectUser(userQuery);
        log.debug("查询入参为{}出参为{}", userQuery, userVOList);
        return userVOList;
    }

    @Override
    public void resetPassword(Long userId) {
        log.debug("重置密码的业务层的入参为{}", userId);
        User user = new User();
        user.setPassword("1234");
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.eq("id", userId);
        log.debug("MyBatis--plus的update方法的入参为{}{}", user, userUpdateWrapper);
        userMapper.update(user, userUpdateWrapper);
    }

    @Override
    public void deleteUser(Long userId) {
        log.debug("删除用户的业务层的入参为{}", userId);
        userMapper.deleteById(userId);
    }

    @Override
    public void updateStatus(Long userId, String status) {
        log.debug("更新用户状态的业务层的入参为{}{}", userId, status);
        User user = new User();
        user.setStatus(status);
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        log.debug("更新用户状态的业务层的入参为{}{}", user, userUpdateWrapper);
        userUpdateWrapper.eq("id", userId);
        userMapper.update(user, userUpdateWrapper);
        log.debug("更新用户状态的业务层的入参为{}{}没有出参", user, userUpdateWrapper);
    }

    @Override
    public void insertUser(User user) {
        log.debug("插入用户业务层的入参为{}",user);
        log.debug("插入用户业务层调用mapper层的入参为{}",user);
        userMapper.insert(user);
        log.debug("插入用户业务层调用mapper层的入参为{}成功",user);
    }

    @Override
    public void deleteUserByStaff(String tel) {
        log.debug("通过员工删除用户业务层的入参为{}",tel);
        log.debug("通过员工删除用户业务层调用mapper层的入参为{}",tel);
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("tel",tel);
        userMapper.delete(userQueryWrapper);
        log.debug("通过员工删除用户业务层调用mapper层的入参为{}成功",tel);
    }
}
